﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Runtime.Serialization;
using System.ServiceModel;
using System.Text;
using DataTier;
using BusinessLogic;
using DataTier.Entities;

namespace DataServices
{
    [ServiceContract(Namespace = WCFSettings.Namespace)]
    [XmlSerializerFormat]
    public interface IProductsService
    {
        /// <summary>
        /// Возвращает список Продуктов
        /// </summary>
        /// <returns></returns>
        [OperationContract]
        [FaultContract(typeof(ExceptionDetail))]
        List<ProductEntity> GetProductList(int currentUserId, int numPage = 1, int onPage = 10, SearchParameters param = null, string sortColumn = null, string sortDirection = null);

        
        /// <summary>
        /// Возвращает список Товаров без тех, у которых установлен признак СКРЫТ
        /// </summary>
        /// <returns></returns>
        [OperationContract]
        [FaultContract(typeof(ExceptionDetail))]
        List<ProductEntity> GetNotHiddenProductList(int currentUserId);


        /// <summary>
        /// Возвращает количество Продуктов из базы данных
        /// </summary>
        /// <returns></returns>
        [OperationContract]
        [FaultContract(typeof(ExceptionDetail))]
        int GetProductListCount(int currentUserId, SearchParameters param = null);


        /// <summary>
        /// Возвращает список Категорий Продуктов
        /// </summary>
        /// <returns></returns>
        [OperationContract]
        [FaultContract(typeof(ExceptionDetail))]
        List<ProductGroup> GetProductGroupList(int currentUserId);


        /// <summary>
        /// Добавляет новый продукт или обновляется уже существующий
        /// </summary>
        /// <param name="product"></param>
        /// <returns></returns>
        [OperationContract]
        [FaultContract(typeof(ExceptionDetail))]
        int SaveProduct(int currentUserId, ProductEntity product);


        /// <summary>
        /// Удаление Продукта из базы данных
        /// </summary>
        /// <param name="currentUserId"></param>
        /// <param name="productId"></param>
        [OperationContract]
        [FaultContract(typeof(ExceptionDetail))]
        void DeleteProduct(int currentUserId, int productId);


        /// <summary>
        /// Обновляет картинку с изображением продукта
        /// </summary>
        /// <param name="currentUserId"></param>
        /// <param name="productId"></param>
        /// <param name="ImageBigUrl"></param>
        /// <param name="ImageSmallUrl"></param>
        [OperationContract]
        [FaultContract(typeof(ExceptionDetail))]
        void UpdateImageProduct(int currentUserId, int productId, string ImageBigUrl, string ImageSmallUrl);


        /// <summary>
        /// Скрытие продукта (установка признака СКРЫТ)
        /// </summary>
        /// <param name="currentUserId"></param>
        /// <param name="productId"></param>
        /// <param name="isHidden"></param>
        [OperationContract]
        [FaultContract(typeof(ExceptionDetail))]
        void SetIsHidden(int currentUserId, int productId, bool isHidden);


        /// <summary>
        /// Возвращает список единиц измерения Товаров
        /// </summary>
        /// <returns></returns>
        [OperationContract]
        [FaultContract(typeof(ExceptionDetail))]
        List<MeasureUnit> GetMeasureUnitList(int currentUserId);


        /// <summary>
        /// Возвращает единицу измерения Товара по ID
        /// </summary>
        /// <returns></returns>
        [OperationContract]
        [FaultContract(typeof(ExceptionDetail))]
        MeasureUnit GetMeasureUnitById(int currentUserId, int measureUnitId);


    }
}
